// await 不一定非要等待async 如果等待的是普通函数那就正常执行 ,如果它等到的是一个 Promise 对象，await 就忙起来了，它会阻塞后面的代码，等着 Promise 对象 resolve，然后得到 resolve 的值，作为 await 表达式的运算结果。
// 看到上面的阻塞一词，心慌了吧……放心，这就是 await 必须用在 async 函数中的原因。async 函数调用不会造成阻塞，它内部所有的阻塞都被封装在一个 Promise 对象中异步执行
function getSomething() {
    return 'Something';
}
async function testAsync() {
    return Promise.resolve('你好,async');
}
async function test() {
    const a1 = await getSomething();
    const a2 = await testAsync();
    console.log(a1, a2);
}
// test();

// 作个简单的比较
// 上面已经说明了 async 会将其后的函数（ 函数表达式或 Lambda） 的返回值封装成一个 Promise 对象， 而 await 会等待这个 Promise 完成， 并将其 resolve 的结果返回出来。

// 现在举例， 用 setTimeout 模拟耗时的异步操作， 先来看看不用 async /await 会怎么写
function takeLongTime() {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(resolve)
        }, 2000);
    })
}
// takeLongTime().then(v => {
//     console.log('got', v);
// })

// 如果改用 async /await 呢， 会是这样
async function test() {
    const v = await takeLongTime();
    console.log(v);
}
// test();

// 又一个疑问产生了， 这两段代码， 两种方式对异步调用的处理（ 实际就是对 Promise 对象的处理） 差别并不明显， 甚至使用 async /await 还需要多写一些代码， 那它的优势到底在哪？

// 单一的 Promise 链并不能发现 async /await 的优势， 但是， 如果需要处理由多个 Promise 组成的 then 链的时候， 优势就能体现出来了（ 很有意思， Promise 通过 then 链来解决多层回调的问题， 现在又用 async /await 来进一步优化它）。

// 假设一个业务， 分多个步骤完成， 每个步骤都是异步的， 而且依赖于上一个步骤的结果。 我们仍然用 setTimeout 来模拟异步操作

/**
 * 传入参数 n，表示这个函数执行的时间（毫秒）
 * 执行的结果是 n + 200，这个值将用于下一步骤
 */


function takeLongTimeOne(n) {
    return new Promise(resolve => {
        setTimeout(() => resolve(n + 200), n);
    });
};

function step1(n) {
    console.log(`step1 with ${n}`);
    return takeLongTimeOne(n);
}

function step2(n) {
    console.log(`step2 with ${m} and ${n}`);
    return takeLongTimeOne(m + n);
}

function step3(n) {
    console.log(`step3 with ${k}, ${m} and ${n}`);
    return takeLongTimeOne(k + m + n);
}

//现在用 Promise 方式来实现这三个步骤的处理

// function doIt() {
//     console.time('doIt');
//     const time1 = 300;
//     step1(time1)
//         .then(time2 => step2(time2))
//         .then(time3 => step3(time3))
//         .then(result => {
//             console.log(`result is ${result}`);
//             console.timeEnd('doIt');
//         })
// }


// doIt();

async function doIt() {
    console.time("doIt");
    const time1 = 300;
    const time2 = await step1(time1);
    const time3 = await step2(time1, time2);
    const result = await step3(time1, time2, time3);
    console.log(`result is ${result}`);
    console.timeEnd("doIt");
}

doIt();